[小ネタ] CloudWatch Logs エクスポート用の S3 バケットを作成する CloudFormation テンプレート

[小ネタ] CloudWatch Logs エクスポート用の S3 バケットを作成する CloudFormation テンプレート

AWS 公式ドキュメントのバケットポリシーを参考にした CloudWatch Logs エクスポート用の S3 バケットを作成する CloudFormation テンプレートです
Clock Icon2024.08.09

アノテーション・テクニカルサポートチームの hato です。

サポート対応において CloudWatch Logs のログを S3 にエクスポートする方法を案内することがあります。

その際、バケットポリシー等が設定された S3 バケットが必要ですが、設定済みの S3 バケットを CloudFormation で一撃で作れると便利かなと思い、テンプレートを作成しましたので、小ネタとしてご紹介します。

テンプレート

AWSTemplateFormatVersion: 2010-09-09
Description: Deploys the S3 bucket required to export logs to CloudWatch Logs

Parameters:
  FilesRetention:
    Type: Number
    Description: Retention period for exported objects
    Default: 30

Resources:
  Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub 'cloudwatch-logs-exporter-bucket-${AWS::AccountId}'
      LifecycleConfiguration:
        Rules:
          - Id: DeleteOldFiles
            Status: Enabled
            ExpirationInDays: !Ref FilesRetention

  BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument: !Sub |
        {
            "Version": "2012-10-17",
            "Statement": [
              {
                  "Action": "s3:GetBucketAcl",
                  "Effect": "Allow",
                  "Resource": "${Bucket.Arn}",
                  "Principal": { "Service": "logs.${AWS::Region}.amazonaws.com" },
                  "Condition": {
                    "StringEquals": {
                        "aws:SourceAccount": [
                            "${AWS::AccountId}"
                        ]
                    },
                    "ArnLike": {
                            "aws:SourceArn": [
                                "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:*"
                            ]
                    }
                  }
              },
              {
                  "Action": "s3:PutObject" ,
                  "Effect": "Allow",
                  "Resource": "${Bucket.Arn}/*",
                  "Principal": { "Service": "logs.${AWS::Region}.amazonaws.com" },
                  "Condition": {
                    "StringEquals": {
                        "s3:x-amz-acl": "bucket-owner-full-control",
                        "aws:SourceAccount": [
                            "${AWS::AccountId}"
                        ]
                    },
                    "ArnLike": {
                            "aws:SourceArn": [
                                "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:*"
                            ]
                    }
                  }
              }
            ]
        }

Outputs:
  CloudWatchLogsExporterBucketName:
    Description: CloudWatch Logs Exporter Bucket Name
    Value: !Ref Bucket
    Export:
      Name: CloudWatchLogsExporterBucketName

かんたんな使い方

  1. 上記テンプレートを任意の名前(例:cwlogs-exporttasks-s3)でテキストファイルとして保存

  2. CloudFormation コンソール
    「テンプレートファイルのアップロード」からアップロード

cwlogs-exporttasks-s3 1

  1. 任意のスタック名とFilesRetention(保持期間※)を指定してスタックを作成
    ※S3 にエクスポートしたログの保持期間となります。

cwlogs-exporttasks-s3 2

  1. エクスポートの際は作成した S3 バケットを指定します。
    (バケット名はcloudwatch-logs-exporter-bucket-<アカウントID>です)

cwlogs-exporttasks-s3 4

解説

S3 バケット名はcloudwatch-logs-exporter-bucket-<アカウントID>となります。

S3 のアクセス許可(バケットポリシー)は CloudWatch Logs と S3 バケットが同一アカウントにある場合の公式サンプルをほぼそのまま使用しています。
置換が必要な AWS アカウント ID 等は擬似パラメータで自動設定しています。

AWS 公式ドキュメントのバケットポリシー
{
    "Version": "2012-10-17",
    "Statement": [
      {
          "Action": "s3:GetBucketAcl",
          "Effect": "Allow",
          "Resource": "arn:aws:s3:::my-exported-logs",
          "Principal": { "Service": "logs.Region.amazonaws.com" },
          "Condition": {
            "StringEquals": {
                "aws:SourceAccount": [
                    "AccountId1",
                    "AccountId2",
                    ...
                ]
            },
            "ArnLike": {
                    "aws:SourceArn": [
                        "arn:aws:logs:Region:AccountId1:log-group:*",
                        "arn:aws:logs:Region:AccountId2:log-group:*",
                        ...
                     ]
            }
          }
      },
      {
          "Action": "s3:PutObject" ,
          "Effect": "Allow",
          "Resource": "arn:aws:s3:::my-exported-logs/*",
          "Principal": { "Service": "logs.Region.amazonaws.com" },
          "Condition": {
            "StringEquals": {
                "s3:x-amz-acl": "bucket-owner-full-control",
                "aws:SourceAccount": [
                    "AccountId1",
                    "AccountId2",
                    ...
                ]
            },
            "ArnLike": {
                    "aws:SourceArn": [
                        "arn:aws:logs:Region:AccountId1:log-group:*",
                        "arn:aws:logs:Region:AccountId2:log-group:*",
                        ...
                    ]
            }
          }
      }
    ]
}

保持期間の設定は、S3 ライフサイクルルール(オブジェクトの有効期限)を使用しています。

オブジェクトの有効期限 - Amazon Simple Storage Service

最後に

この記事が誰かのお役にたてば幸いです。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイト をぜひご覧ください。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.